home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Visual Basic Toolbox
/
Visual Basic Toolbox (P.I.E.)(1996).ISO
/
database
/
mdbguru
/
dict.bas
< prev
next >
Wrap
BASIC Source File
|
1994-09-24
|
14KB
|
397 lines
Option Explicit
' for the ini file stuff
Declare Function GetPrivateProfileInt% Lib "Kernel" (ByVal lpAppName$, ByVal lpKeyName$, ByVal nDefault%, ByVal lpFileName$)
Declare Function GetPrivateProfileString% Lib "Kernel" (ByVal lpAppName$, ByVal lpKeyName$, ByVal lpDefault$, ByVal lpReturnedString$, ByVal nSize%, ByVal lpFileName$)
' status function
Const DICT_STATUS_FATAL = 1
Const DICT_STATUS_MESSAGE = 2
Const DICT_STATUS_PROGRESS = 3
' status function can return one of these values
Const DICT_STATUS_RETURN_NONE = 0
'
' Data Access constants
'
' Option argument values (CreateDynaset, etc)
Global Const DB_DENYWRITE = &H1
Global Const DB_DENYREAD = &H2
Global Const DB_READONLY = &H4
Global Const DB_APPENDONLY = &H8
Global Const DB_INCONSISTENT = &H10
Global Const DB_CONSISTENT = &H20
Global Const DB_SQLPASSTHROUGH = &H40
' SetDataAccessOption
Global Const DB_OPTIONINIPATH = 1
' Field Attributes
Global Const DB_FIXEDFIELD = &H1
Global Const DB_VARIABLEFIELD = &H2
Global Const DB_AUTOINCRFIELD = &H10
Global Const DB_UPDATABLEFIELD = &H20
' Field Data Types
Global Const DB_BOOLEAN = 1
Global Const DB_BYTE = 2
Global Const DB_INTEGER = 3
Global Const DB_LONG = 4
Global Const DB_CURRENCY = 5
Global Const DB_SINGLE = 6
Global Const DB_DOUBLE = 7
Global Const DB_DATE = 8
Global Const DB_TEXT = 10
Global Const DB_LONGBINARY = 11
Global Const DB_MEMO = 12
' TableDef Attributes
Global Const DB_ATTACHEXCLUSIVE = &H10000
Global Const DB_ATTACHSAVEPWD = &H20000
Global Const DB_SYSTEMOBJECT = &H80000002
Global Const DB_ATTACHEDTABLE = &H40000000
Global Const DB_ATTACHEDODBC = &H20000000
' ListTables TableType
Global Const DB_TABLE = 1
Global Const DB_QUERYDEF = 5
' ListTables Attributes (for QueryDefs)
Global Const DB_QACTION = &HF0
Global Const DB_QCROSSTAB = &H10
Global Const DB_QDELETE = &H20
Global Const DB_QUPDATE = &H30
Global Const DB_QAPPEND = &H40
Global Const DB_QMAKETABLE = &H50
' ListIndexes IndexAttributes values
Global Const DB_UNIQUE = 1
Global Const DB_PRIMARY = 2
Global Const DB_PROHIBITNULL = 4
Global Const DB_IGNORENULL = 8
' ListIndexes FieldAttributes value
Global Const DB_DESCENDING = 1 'For each field in Index
' CreateDatabase and CompactDatabase Language constants
Global Const DB_LANG_GENERAL = ";LANGID=0x0809;CP=1252;COUNTRY=0"
Global Const DB_LANG_SPANISH = ";LANGID=0x040A;CP=1252;COUNTRY=0"
Global Const DB_LANG_DUTCH = ";LANGID=0x0413;CP=1252;COUNTRY=0"
Global Const DB_LANG_SWEDFIN = ";LANGID=0x040C;CP=1252;COUNTRY=0" 'VB3 and Access 1.1 Databases
Global Const DB_LANG_NORWDAN = ";LANGID=0x0414;CP=1252;COUNTRY=0" 'VB3 and Access 1.1 Databases
Global Const DB_LANG_ICELANDIC = ";LANGID=0x040F;CP=1252;COUNTRY=0" 'VB3 and Access 1.1 Databases
Global Const DB_LANG_NORDIC = ";LANGID=0x041D;CP=1252;COUNTRY=0" 'Access 1.0 Databases only
' CreateDatabase and CompactDatabase options
Global Const DB_VERSION10 = 1 ' Microsoft Access Version 1.0
Global Const DB_ENCRYPT = 2 ' Make database encrypted.
Global Const DB_DECRYPT = 4 ' Decrypt database while compacting.
'Collating order values
Global Const DB_SORTGENERAL = 256 ' Sort by EFGPI rules (English, French, German,Portuguese, Italian)
Global Const DB_SORTSPANISH = 258 ' Sort by Spanish rules
Global Const DB_SORTDUTCH = 259 ' Sort by Dutch rules
Global Const DB_SORTSWEDFIN = 260 ' Sort by Swedish, Finnish rules
Global Const DB_SORTNORWDAN = 261 ' Sort by Norwegian, Danish rules
Global Const DB_SORTICELANDIC = 262 ' Sort by Icelandic rules
Global Const DB_SORTPDXINTL = 4096 ' Sort by Paradox international rules
Global Const DB_SORTPDXSWE = 4097 ' Sort by Paradox Swedish, Finnish rules
Global Const DB_SORTPDXNOR = 4098 ' Sort by Paradox Norwegian, Danish rules
Global Const DB_SORTUNDEFINED = -1 ' Sort rules are undefined or unknown
Function dictCreate (ByVal cIniFile As String, ByVal cNewDBName As String) As Integer
Dim i As Integer
Dim j As Integer
Dim cDBName As String
Dim cLang As String
Dim ret As Integer
Dim db As database
Dim nTables As Integer
Dim cQDefName As String
Dim nQDefs As Integer
Dim nFields As Integer
Dim nIndexes As Integer
Dim lAttached As Integer
Dim cConnect As String
Dim cSource As String
Dim cBuffer As String
Dim cIdxFields As String
Dim tbd() As New tabledef
Dim idx() As New index
Dim fld() As New field
Dim qd() As querydef
Dim cAttr As String
Dim nAttr As Long
Dim cType As String
Dim cTableName As String
Dim cFieldName As String
Dim cIdxName As String
Dim lPrimary As Integer
Dim lUnique As Integer
Dim nSize As Integer
Dim nType As Integer
Dim cSQL As String
dictCreate = False
If cNewDBName = "" Then
cDBName = Space(80)
ret = GetPrivateProfileString("Database", "Name", "", cDBName, 80, cIniFile)
cDBName = Trim(cDBName)
If cDBName = "" Then
ret = dictStatus(DICT_STATUS_FATAL, "Invalid Database name or INI File invalid format!", 0, 0)
Exit Function
End If
Else
cDBName = cNewDBName
End If
cLang = Space(20)
ret = GetPrivateProfileString("Database", "Language", "", cLang, 20, cIniFile)
cLang = Trim(cLang)
If cLang = "" Then
ret = dictStatus(DICT_STATUS_FATAL, "Invalid Database name or INI File invalid format!", 0, 0)
Exit Function
End If
On Error Resume Next
Kill cDBName
On Error GoTo cantDoIt
ret = dictStatus(DICT_STATUS_MESSAGE, "Creating database", 0, 0)
Select Case cLang
Case "DB_LANG_GENERAL"
Set db = CreateDatabase(cDBName, DB_LANG_GENERAL)
Case "DB_LANG_SPANISH"
Set db = CreateDatabase(cDBName, DB_LANG_SPANISH)
Case "DB_LANG_DUTCH"
Set db = CreateDatabase(cDBName, DB_LANG_DUTCH)
Case "DB_LANG_SWEDFIN"
Set db = CreateDatabase(cDBName, DB_LANG_SWEDFIN)
Case "DB_LANG_NORWDAN"
Set db = CreateDatabase(cDBName, DB_LANG_NORWDAN)
Case "DB_LANG_ICELANDIC"
Set db = CreateDatabase(cDBName, DB_LANG_ICELANDIC)
Case "DB_LANG_NORDIC"
Set db = CreateDatabase(cDBName, DB_LANG_NORDIC)
Case Else
Set db = CreateDatabase(cDBName, DB_LANG_GENERAL)
End Select
nTables = GetPrivateProfileInt("Tables", "Count", 0, cIniFile)
ret = dictStatus(DICT_STATUS_PROGRESS, "Creating tables", 0, nTables)
For i = 1 To nTables
cTableName = Space(80)
ret = GetPrivateProfileString("Tables", "Table" + LTrim(Str(i - 1)), "", cTableName, 80, cIniFile)
' strip the table attributes off the name
cTableName = Trim(cTableName)
cAttr = Mid(cTableName, InStr(cTableName + ",", ",") - 1)
cTableName = Mid(cTableName, 1, InStr(cTableName + ",", ",") - 1)
If cTableName = "" Then
ret = dictStatus(DICT_STATUS_FATAL, "Error in INI File creating table " + LTrim(Str(j - 1)), 0, 0)
Exit Function
End If
ret = dictStatus(DICT_STATUS_PROGRESS, "Creating table " + cTableName, i, nTables)
nAttr = 0
lAttached = False
If InStr(cAttr, "DB_ATTACHEXCLUSIVE") Then
nAttr = nAttr + DB_ATTACHEXCLUSIVE
lAttached = True
End If
If InStr(cAttr, "DB_ATTACHSAVEPWD") Then
nAttr = nAttr + DB_ATTACHSAVEPWD
lAttached = True
End If
If InStr(cAttr, "DB_SYSTEMOBJECT") Then
nAttr = nAttr + DB_SYSTEMOBJECT
End If
If InStr(cAttr, "DB_ATTACHEDTABLE") Then
nAttr = nAttr + DB_ATTACHEDTABLE
lAttached = True
End If
If InStr(cAttr, "DB_ATTACHEDODBC") Then
nAttr = nAttr + DB_ATTACHEDODBC
lAttached = True
End If
ReDim tbd(1) As New tabledef
tbd(0).Name = cTableName
If nAttr Then
tbd(0).Attributes = nAttr
If lAttached Then
cConnect = Space(80)
ret = GetPrivateProfileString(cTableName, "Connect", "", cConnect, 80, cIniFile)
cConnect = Left(cConnect, ret)
If cConnect = "" Then
ret = dictStatus(DICT_STATUS_FATAL, "Error in INI file creating connected table " + cTableName, 0, 0)
Exit Function
End If
cSource = Space(80)
ret = GetPrivateProfileString(cTableName, "SourceTable", "", cSource, 80, cIniFile)
cSource = Left(cSource, ret)
If cSource = "" Then
ret = dictStatus(DICT_STATUS_FATAL, "Error in INI file creating connected table " + cTableName, 0, 0)
Exit Function
End If
tbd(0).Connect = cConnect
tbd(0).SourceTableName = cSource
End If
End If
nFields = GetPrivateProfileInt(cTableName, "FieldCount", 0, cIniFile)
For j = 1 To nFields
cBuffer = Space(128)
ret = GetPrivateProfileString(cTableName, "Field" + LTrim(Str(j - 1)), "", cBuffer, 128, cIniFile)
If Trim(cBuffer) = "" Then
ret = dictStatus(DICT_STATUS_FATAL, "Error in INI file creating fields for table " + cTableName, 0, 0)
Exit Function
End If
cFieldName = Mid(cBuffer, 1, InStr(cBuffer + ",", ",") - 1)
cBuffer = Mid(cBuffer, InStr(cBuffer + ",", ",") + 1)
cType = Mid(cBuffer, 1, InStr(cBuffer + ",", ",") - 1)
cBuffer = Mid(cBuffer, InStr(cBuffer + ",", ",") + 1)
nSize = Val(Mid(cBuffer, 1, InStr(cBuffer + ",", ",") - 1))
cBuffer = Mid(cBuffer, InStr(cBuffer + ",", ",") + 1)
cAttr = Mid(cBuffer, 1, InStr(cBuffer + ",", ",") - 1)
Select Case cType
Case "DB_LONG"
nType = DB_LONG
Case "DB_INTEGER"
nType = DB_INTEGER
Case "DB_TEXT"
nType = DB_TEXT
Case "DB_BOOLEAN"
nType = DB_BOOLEAN
Case "DB_SINGLE"
nType = DB_SINGLE
Case "DB_DOUBLE"
nType = DB_DOUBLE
Case "DB_MEMO"
nType = DB_MEMO
Case "DB_BYTE"
nType = DB_BYTE
Case "DB_DATE"
nType = DB_DATE
Case "DB_LONGBINARY"
nType = DB_LONGBINARY
Case "DB_CURRENCY"
nType = DB_CURRENCY
Case Else
ret = dictStatus(DICT_STATUS_FATAL, "Error in INI file creating fields for table " + cTableName, 0, 0)
Exit Function
End Select
nAttr = 0
If InStr(cAttr, "DB_FIXEDFIELD") Then nAttr = nAttr + DB_FIXEDFIELD
If InStr(cAttr, "DB_AUTOINCRFIELD") Then nAttr = nAttr + DB_AUTOINCRFIELD
If InStr(cAttr, "DB_UPDATABLEFIELD") Then nAttr = nAttr + DB_UPDATABLEFIELD
ReDim fld(0) As New field
fld(0).Name = cFieldName
fld(0).Type = nType
fld(0).Size = nSize
fld(0).Attributes = nAttr
tbd(0).Fields.Append fld(0)
Next j
nIndexes = GetPrivateProfileInt(cTableName, "IndexCount", 0, cIniFile)
For j = 1 To nIndexes
ReDim idx(1) As New index
cBuffer = Space(128)
ret = GetPrivateProfileString(cTableName, "Index" + LTrim(Str(j - 1)), "", cBuffer, 128, cIniFile)
cIdxName = Mid(cBuffer, 1, InStr(cBuffer + ",", ",") - 1)
cBuffer = Mid(cBuffer, InStr(cBuffer + ",", ",") + 1)
cIdxFields = Mid(cBuffer, 1, InStr(cBuffer + ",", ",") - 1)
cBuffer = Mid(cBuffer, InStr(cBuffer + ",", ",") + 1)
lPrimary = Val(cBuffer)
cBuffer = Mid(cBuffer, InStr(cBuffer + ",", ",") + 1)
lUnique = Val(cBuffer)
idx(0).Name = cIdxName
idx(0).Fields = cIdxFields
idx(0).Unique = lUnique
idx(0).Primary = lPrimary
tbd(0).Indexes.Append idx(0)
Next j
db.TableDefs.Append tbd(0)
Next i
ret = dictStatus(DICT_STATUS_PROGRESS, "", -1, 0)
nQDefs = GetPrivateProfileInt("QueryDefinitions", "Count", 0, cIniFile)
ret = dictStatus(DICT_STATUS_PROGRESS, "Creating query definitions", 0, nQDefs)
For i = 1 To nQDefs
cBuffer = Space(1024)
ret = GetPrivateProfileString("QueryDefinitions", "QueryDef" + LTrim(Str(i - 1)), "", cBuffer, 1024, cIniFile)
cBuffer = Left(cBuffer, ret)
If cBuffer = "" Then
ret = dictStatus(DICT_STATUS_FATAL, "Error in INI file creating query definition " + LTrim(Str(i - 1)), 0, 0)
Exit Function
End If
cQDefName = Mid(cBuffer, 1, InStr(cBuffer + ",", ",") - 1)
cSQL = Mid(cBuffer, InStr(cBuffer + ",", ",") + 1)
ret = dictStatus(DICT_STATUS_PROGRESS, "", i, nQDefs)
ReDim qd(0) As querydef
Set qd(0) = db.CreateQueryDef(cQDefName, cSQL)
qd(0).Close
Next i
ret = dictStatus(DICT_STATUS_PROGRESS, "", -1, 0)
db.Close
ret = dictStatus(DICT_STATUS_MESSAGE, "Database creation complete", 0, 0)
dictCreate = True
Exit Function
cantDoIt:
ret = dictStatus(DICT_STATUS_FATAL, Error$, 0, 0)
Exit Function
End Function
Function dictStatus (nType As Integer, cMsg As String, nItem As Integer, nItems As Integer) As Integer
dictStatus = DICT_STATUS_RETURN_NONE
Select Case nType
Case DICT_STATUS_FATAL
fTestDict.Label1.Caption = cMsg
fTestDict.hsProgress.Visible = False
MsgBox cMsg, MB_OK, "Fatal Error!"
Case DICT_STATUS_MESSAGE
fTestDict.Label1.Caption = cMsg
fTestDict.Label1.Refresh
Case DICT_STATUS_PROGRESS
If nItem = 0 Then
fTestDict.hsProgress.Visible = True
fTestDict.hsProgress.Min = 1
fTestDict.hsProgress.Max = nItems
fTestDict.hsProgress.Value = 1
ElseIf nItem = -1 Then
fTestDict.hsProgress.Visible = False
Else
fTestDict.hsProgress.Value = nItem
End If
fTestDict.Label1.Caption = cMsg
fTestDict.Label1.Refresh
End Select
End Function